
// 在 node.js 环境中使用 global 来表示 "全局对象"
console.log( global === globalThis ); // true
// 在 浏览器 等客户端环境下，使用 window 来表示 "全局对象"

console.log( '- - - - - - - - - - - - - - -' );

// 标准内置对象 Object 是除了 global对象 之外的 所有对象(class-level) 的 父对象
// 类似于Java语言中，Object类是其它所有类的父类

class Animal { // 若为明确指定继承哪个类则默认继承Object
    constructor(id,name){
        this.id = id ;
        this.name = name ;
    }
}

// 使用 extends 可以指定继承哪个类
class Birds extends Animal {
    constructor(id,name){
        super(id,name); // 在子类构造函数内部通过super可以调用父类构造函数
    }
}

class Beast extends Animal {
    constructor(id,name){
        super(id,name);
    }
}

let b = new Birds(1,'孔雀');
console.log( b.toString() ); // Object.prototype.toString
console.log( b.hasOwnProperty( 'id' ) ); // Object.prototype.hasOwnProperty

console.log( '- - - - - - - - - - - - - - -' );

// 所有对象(class-level)的原型(prototype)都是一个实例(instance)
let p = Animal.prototype ;
// 获得 p 所引用实例(instance)对应的对象(class-level)的原型(prototype)
let proto = Object.getPrototypeOf( p ) ;// let proto = p.__proto__ ;
// 使用原型的 constructor 属性获得该原型对应的 构造函数 (即对象)
let cons = proto.constructor ;
console.log( cons.name ); // 输出构造函数名称(即对象名称)

console.log( Birds.prototype.__proto__.constructor.name );
console.log( Object.getPrototypeOf(Birds.prototype).constructor.name );
console.log( Beast.prototype.__proto__.constructor.name );
console.log( Object.getPrototypeOf(Beast.prototype).constructor.name );